package dao;
import bean.Express;
import bean.Express;
import java.util.Objects;
import java.util.Random;

//数据操作的类，定义数据的增删改查操作
public class ExpressDao {
    private Express[][] data=new  Express[10][];//充当数据库
    {
        for (int i=0;i<10;i++){
            data[i]=new Express[10];  //data[i]表示第i行首地址
        }
    }
    private int size;//记录数组存储元素个数
    private Random random=new Random();

    /**
     * 存快递:
     * 确定柜子有位置--x,y下标找到空柜--快递入柜
     * @param e
     * @return
     */
    public boolean add(Express e){
        //不考虑快递单号重复，且随机存储
        //随机生成2个0-9下标，循环直到找到空柜为止，若柜满则无限循环，
        //为此可以定义变量size记录快递数量代替遍历数组，空间换时间。
        if (size==100){
            return false;
        }
        int x=-1;
        int y=-1;
        while(true){
            x = random.nextInt(10);
            y=random.nextInt(10);
            if (data[x][y]==null){ //找到空柜
                break;
            }
        }
        //补全快递信息存入柜中
        int code=randomCode();
        //System.out.println("code1:"+code);
        e.setCode(code);
        data[x][y]=e;
        return true;
    }

    /**
     * 生成取件码(不重复:若根据取件码查询到快递则重复)
     * @return
     */
    public int randomCode(){
        while(true){
            int code=random.nextInt(900000)+ 100000;
            System.out.println("code："+code);
            Express e=findByCode(code);
            if (e==null){
                return code;
            }
        }
    }

    /**
     * 根据快递单号查询快递
     * @param number
     * @return
     */
    public Express findByNumber(String number){
        //下面比较单号是用对象比较，实体类重写equals方法比较规则是单号，
        //data[i][j].getNumber()比较单号，用的equals是String重写的，不是自己重写的
        Express e = new Express();
        e.setNumber(number);
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (e.equals(data[i][j])){
                    return data[i][j];
                }
            }
        }
        return null;
    }

    /**
     * 通过取件码查询快递:暴力循环
     * @param code
     * @return
     */
    public Express findByCode(int code){
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (data[i][j]!=null&&data[i][j].getCode()==code){
                    return data[i][j];
                }
            }
        }
        return null;
    }

    /**多余操作，为了mvc更圆润。
     * 模拟数据库，删除原数据，保存新数据
     * @param oldExpress
     * @param newExpress
     */
    public void update(Express oldExpress,Express newExpress ){
        delete(oldExpress);
        add(newExpress);
    }

    /**
     * 根据快递单号删除快递
     * @param e
     */
    public void delete(Express e){
        p:for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (e.equals(data[i][j])){ //根据单号判等
                    data[i][j]=null;
                    break p;
                }
            }
        }
    }

    /**
     * 查询所有快递
     * @return
     */
    public Express[][] findAll(){
        return data;
    }
}